2.4 多权限作用影响
在实际使用中,1个用户经常会授权多个角色,也就是1个用户可以授权多个权限。那多个权限是如何互相作用和影响的?我们需要分不同权限类型来看。
1.功能权限
多个功能权限之间不存在冲突,可以并集累加上去,但同一页面需要去重。
比如项目经理,即需要访问信息发布页面,也需要访问销售订单页面,就可以把这两个页面的功能权限分配给这个角色。例子如下表所示:
功能权限1 | 功能权限2 | 功能权限3 | 授权结果 |
---|---|---|---|
信息发布页面 | 销售订单页面 | 销售订单页面 | 信息发布页面、销售订单页面 |
2.数据权限
数据权限的多权限作用影响需要区分不同的操作来看。
(1)查询数据
查询数据优先满足行权限(也就是先要符合where条件),如果存在多个权限,这些权限的行权限做or操作,权限的列字段做一个交集来返回。列字段做交集返回目的是在有查询条件的情况,尽可能降低用户的访问范围,保护数据隐私。
比如在查看信息发布数据,有的用户只能查看状态为正常的信息,管理员用户可以同时查看正常和删除的信息,这样可以给管理员用户同时分配这2个权限。例子如下表所示:
查询数据权限1 | 查询数据权限2 | 查询结果 |
---|---|---|
title,status where status=1 |
title,type where status=1 |
title where status=1 |
title,status where status=1 |
title,type where status=0 |
title where status=1 or status = 0 |
所有列 where status=1 and type='新闻公告' |
title,type where status=0 |
title,type where (status=1 and type='新闻公告') or status=0 |
查询数据会受到“单独使用的列权限”和“只有返回的列在权限指定的列范围内时才应用”这两个选项的影响,比如设置了“单独使用的列权限”,原来多个权限列字段的交集返回会改成并集返回,具体实现效果参考 2.2 数据权限 章节中的高级特性内容。
(2)插入数据
插入数据的操作,主要是判断列权限是否符合要求。
多个权限的列权限不会并集累加,而是取满足条件的权限进行使用,如果其中有1个权限满足条件,则判断成功。
比如信息管理员拥有多个信息发布的插入权限,当出现插入数据操作,会遍历这些权限,直到找到满足插入这些字段的权限。如果未找到,则提示无权限,插入失败。例子如下表所示:
例子:插入的列 | 插入数据权限1 | 插入数据权限2 | 插入数据权限3 | 处理结果 |
---|---|---|---|---|
fid,title,type,status | fid,title(不满足要求) | fid,title,type,status(满足要求) | fid,person,title,type,status(满足要求) | 插入成功 |
fid,title,type,status | fid,title(不满足要求) | type,status(不满足要求) | 插入失败 | |
fid,title,type,status | fid,title(不满足要求) | 所有列(满足要求) | 插入成功 | |
fid,title,type=新闻公告,status | type=新闻公告(不满足要求) | 所有列(满足要求) | 插入成功 | |
fid,title,type=新闻公告,status | type=新闻公告(不满足要求) | 所有列(满足要求) | fid,title,type=新闻公告,status(满足要求) | 插入成功 |
(3)删除数据
删除数据的操作只有行权限(也就是where条件),对同一个数据集进行删除,多个权限可以对不同的where条件进行or操作。
需要注意的是,如果某删除数据权限未设置任何过滤条件,再和其他有过滤条件的进行组合,则这个无过滤条件不会起作用。
比如信息管理员拥有多个信息发布的删除权限,这些删除权限的where条件会进行并集操作,当出现删除数据操作时,只要符合其中一项条件,数据就可以被成功删除,否则删除失败。例子如下表所示:
例子:删除的列 | 删除数据权限1 | 删除数据权限2 | 删除数据权限3 | 授权结果 | 处理结果 |
---|---|---|---|---|---|
status = 0 | status = 0 | type = '新闻公告' | type = '财务公告' | status = 0 or type = '新闻公告' or type = '财务公告' | 删除成功 |
type = '置顶公告' | status = 0 | type = '新闻公告' | 有删除数据权限,但未设置where条件 | status = 0 or type = '新闻公告' | 删除失败 |
type = '置顶公告' | 有删除数据权限,但未设置where条件 | 不限定条件 | 删除成功 |
(4)更新数据
更新数据的操作需要同时判断列权限和行权限,先判断列权限(优先使用有行权限配置的进行判断),再判断行权限(也就是where条件)。
比如信息管理员拥有多个信息发布的更新权限,判断过程如下:
1、当出现更新数据操作时,会优先查找带where条件的权限,判断该权限的字段是否满足更新操作的字段,如果字段满足则判断where条件是否满足,满足则更新成功;
2、不满足则继续查找下一个带where条件的权限。如果带where条件的权限都不满足,则更新失败。
3、如果只有不带where条件的权限,会判断该权限的字段是否满足更新操作的字段,满足则更新成功。
例子如下表所示:
例子:更新的列 | 更新数据权限1 | 更新数据权限2 | 判断过程 | 处理结果 |
---|---|---|---|---|
fid,type,status where type='新闻公告' |
所有列 where条件未设置 |
fid,type,status where type='置顶公告' |
列权限:找到符合的权限2; 行权限:权限2不符合 |
更新失败 |
fid,type,status where type='新闻公告' |
所有列 where条件未设置 |
列权限:找到符合的权限1; 行权限:权限1符合 |
更新成功 | |
fid,type,status=1 where type='新闻公告' |
fid,type,status=0 where type='新闻公告' |
fid,type,status where type='置顶公告' |
列权限:找到符合的权限2; 行权限:权限2不符合 |
更新失败 |
fid,type,status=1 where type='置顶公告' |
所有列 where条件未设置 |
所有列 where type='新闻公告' |
列权限:找到符合的权限2; 行权限:权限2不符合 |
更新失败 |
fid,type,status=1 where type='置顶公告' |
所有列 where条件未设置 |
type,status=1 where type='新闻公告' |
列权限:找到符合的权限1; 行权限:权限1符合 |
更新成功 |
3.API权限
API权限跟功能权限比较类似,多个权限之间不存在冲突,可以并集累加上去,但同一服务需要去重。
比如项目经理,即需要修改信息备注,也需要修改订单状态,就可以把这两个服务的API权限分配给这个角色。例子如下表所示:
API权限1 | API权限2 | API权限3 | 授权结果 |
---|---|---|---|
修改信息备注服务 | 修改订单状态服务 | 修改订单状态服务 | 修改信息备注服务、修改订单状态服务 |